WACI DIDComm
Tipos de mensaje
El protocolo define distintos flujos de mensajes dependendiendo de si se quiere emitir una credencial o presentar una credencial. Estos mensajes se distinguen en pasos segun la especificacion WACI-DIDComm Interop Profile.
Paso | Emisión | Presentación |
1 | Out of band | Out of band |
2 | Propose Credential | Propose Presentation |
3 | Offer Credential | Request Presentation |
4 | Request Credential | Present Proof |
5 | Ack | Ack Presentation |
El servicio WACIInterpreter se encarga de tomar el mensaje, interpretar si es de tipo WACI y ademas que flujo pertenece para responder con el mesaje oportuno.
1. Instala
npm i @extrimian/waci
2. Instancia
const waci = new WACIInterpreter();
3. Interpreta el mensaje
waci.isWACIMessage(messageToCheck);
messageToCheck puede ser cualquier tipo de mensaje, si no tiene la estructura de una mensaje de WACI lo descarta.
Para que sea de tipo WACI debe tener la siguiente estructura:
type WACIMessage = {
type: WACIMessageType;
id: string;
from: string;
to?: string[];
body?: any;
pthid?: string;
thid?: string;
attachments?: any[];
};
4. Procesa el mensaje
waci.processMessage(WACIMessage[])
processMessage se encarga de recibir un mensaje WACI y delegar su interpretacion al handler que corresponda al tipo de mensaje que sea.
5. Set Up For
El WACIInterpreter tiene un metodo llamado setUpFor para definir el flujo correspondiente al intercambio de credenciales.
new WACIInterpreter().setUpFor<Actor>(params: InputCallbacks[Actor], actor: Actor);
Requiere la definicion del Actor ya que el flujo de WACI cambia dependiendo de los actores.
enum Actor {
Holder = "holder",
Issuer = "issuer",
Verifier = "verifier",
}
Luego se deben configurara distintos tipos de callbacks segun se quiera emitir, presentar o verificar una credencial.
Por ejemplo para la verificación de una credencial se deberia instanciar de la siguiente manera:
waci.setUpFor(
{
getPresentationDefinition: (): any => {
return [credentialModel];
},
verifyCredential: async (credential: any): Promise<boolean> => {
console.log('Credential', JSON.stringify(credential, null, 2));
const vcVerifierService = new VCVerifierService({
didDocumentResolver: didResolver.resolveDid,
});
const verifier = await vcVerifierService.verify(credential, {
name: 'assertionMethod',
});
console.log('verifiers', JSON.stringify(verifier, null, 2));
return verifier.result;
},
}
Actor.Verifier)